package concoursbelote;

import java.util.Random;

/**
 * 
 * @author Guillaume
 *
 */
public abstract class Client extends Humains 
{
	
	

	//*********************************************************
	//			ATTRIBUTS
	//*********************************************************
	private String boissonFavorite;
	private String boissonFavoriteSecours;
	private double degreAlcoolemie;
	private int degreConsommation;
	private int jourBanissement;
	
	
	//*********************************************************
	//			CONSTRUCTEURS
	//*********************************************************
	
	/**
	 * Transforme une Humain en Client en ajoutant sa boisson favorite
	 * @author Guillaume
	 * @param prenom
	 * @param surnom
	 * @param porteMonnaie
	 * @param coteDePopularite
	 * @param criSignificatif
	 * @param boissonFavorite
	 */
	public Client(String prenom, String surnom, double porteMonnaie, double coteDePopularite, String criSignificatif, String boissonFavorite) 
	{
		super(prenom, surnom, porteMonnaie, coteDePopularite, criSignificatif);
		this.boissonFavorite = boissonFavorite;
	}
	
	/**
	 * Permet de construire un Client en ajoutant sa boisson favorite de secours
	 * @author Guillaume
	 * @param prenom
	 * @param surnom
	 * @param porteMonnaie
	 * @param coteDePopularite
	 * @param criSignificatif
	 * @param boissonFavorite
	 * @param boissonFavoriteSecours
	 */
	public Client(String prenom, String surnom, double porteMonnaie, double coteDePopularite, String criSignificatif, String boissonFavorite,
			String boissonFavoriteSecours)
	{
		this(prenom, surnom, porteMonnaie, coteDePopularite, criSignificatif, boissonFavorite);
		this.boissonFavoriteSecours = boissonFavoriteSecours;
	}
	
	/**
	 * Permet d'ajouter le degré d'alcoolémie à un Client(initialement à 0), son degré de sagesse (initialement à 0), 
	 * @author Guillaume
	 * @param prenom
	 * @param surnom
	 * @param porteMonnaie
	 * @param coteDePopularite
	 * @param criSignificatif
	 * @param boissonFavorite
	 * @param boissonFavoriteSecours
	 * @param degreAlcoolemie
	 * @param degreSagesse
	 * @param degreConsommation
	 */
	public Client(String prenom, String surnom, double porteMonnaie, double coteDePopularite, String criSignificatif, String boissonFavorite,
			String boissonFavoriteSecours, double degreAlcoolemie, int degreConsommation, int jourBanissement) 
	{
		this(prenom, surnom, porteMonnaie, coteDePopularite, criSignificatif, boissonFavorite, boissonFavoriteSecours);
		this.degreAlcoolemie = degreAlcoolemie;
		this.degreConsommation = degreConsommation;
		this.jourBanissement = jourBanissement;
	}
	

	//*********************************************************
	//			GETTEURS
	//*********************************************************
	public String getBoissonFavorite() 
	{
		return boissonFavorite;
	}

	public String getBoissonFavoriteSecours() 
	{
		return boissonFavoriteSecours;
	}

	public double getDegreAlcoolemie() 
	{
		return degreAlcoolemie;
	}

	public double getDegreConsommation() 
	{
		return degreConsommation;
	}
	
	public int getJourBanissement() 
	{
		return jourBanissement;
	}

	//*********************************************************
	//			SETTEURS
	//*********************************************************
	public void setDegreAlcoolemie(double degreAlcoolemie)
	{
		this.degreAlcoolemie = degreAlcoolemie;
	}
	public void setDegreConsommation(int degreConsommation)
	{
		this.degreConsommation = degreConsommation;
	}
	public void setJourBanissement(int jourBanissement) 
	{
		this.jourBanissement = jourBanissement;
	}
	//*********************************************************
	//			METHODS
	//*********************************************************
	public abstract void offirUneTournee(int indexClient);
	public abstract void refuserUnVerre(int index);
	
	/**
	 * Commande une boisson auprès du serveur
	 * @author Shehu
	 * @param indexBoisson
	 */
	public void commander(int indexBoisson, int indexClient)
	{
		System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + "> Je voudrais " + Administration.currentBar.mesBoissons.get(indexBoisson).getEcriture() + " " + Administration.currentBar.mesBoissons.get(indexBoisson).getNomBoisson());
	}
	
	/**
	 * Cette méthode permet de trouver l'index de la boisson favorite de secours d'un client uniquement si ça boisson favorite n'est plus en stock
	 * @author Shehu
	 * @param indexClient
	 * @return index de la boisson favorite de secours du client
	 */
	public int changerBoisson(int indexClient)
	{	
		for(int indexNewBoisson=0; indexNewBoisson<Main.repertoireBar.get(Main.indexBar).mesBoissons.size(); indexNewBoisson++)
		{
			if(Administration.currentBar.mesBoissons.get(indexNewBoisson).getNomBoisson().equalsIgnoreCase(Administration.currentBar.clients.get(indexClient).getBoissonFavoriteSecours()))
			{	    
				if(Administration.currentBar.mesBoissons.get(indexNewBoisson).getStocks() == 0)
				{
					indexNewBoisson = Administration.selectionBoissonSansAlcool();
				}
				System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + "> A zut. Dans ce cas, je vais prendre " + Administration.currentBar.mesBoissons.get(indexNewBoisson).getEcriture() + " " + 
						Administration.currentBar.mesBoissons.get(indexNewBoisson).getNomBoisson());
				return indexNewBoisson;
			}
		}
		return 0;
	}
	
	/**
	 * Modifie le degré d'alcoolémie d'un cient
	 * @author Guillaume
	 * @param indexBoisson
	 */
	public void boire(int indexBoisson)
	{
		System.out.println("A la vôtre\n");
		setDegreAlcoolemie(getDegreAlcoolemie() + Administration.currentBar.mesBoissons.get(indexBoisson).getDegreParVerre());
	}
	
	/**
	 * Appel un serveur au hasard. Change la formule suivant si le serveur selectionné est un homme ou une femme et si il a déjà trop bu ou non
	 * @author Guillaume
	 * @param indexServeur, indexClient
	 */
	public void appelerServeur (int indexServeur, int indexClient)
	{
		if(Administration.currentBar.serveur.get(indexServeur).getClass().getName().equalsIgnoreCase("concoursbelote.ServeurHomme"))
		{
			if(Administration.currentBar.clients.get(indexClient).getDegreAlcoolemie() < 0.5)
			{
				System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + "> Monsieur, s'il vous plaît");
			}
			else if(Administration.currentBar.clients.get(indexClient).getDegreAlcoolemie() >= 0.5)
			{
				if(Administration.currentBar.clients.get(indexClient).getClass().getName().equalsIgnoreCase("concoursbelote.ClientFemme"))
				{
					System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + "> Tu peux venir mon Coco??");
				}
				else if(Administration.currentBar.clients.get(indexClient).getClass().getName().equalsIgnoreCase("concoursbelote.ClientHomme"))
				{
					System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + "> GARCON!!!");
				}
			}
		}
		else if(Administration.currentBar.serveur.get(indexServeur).getClass().getName().equalsIgnoreCase("concoursbelote.ServeurFemme"))
		{
			if(Administration.currentBar.clients.get(indexClient).getDegreAlcoolemie() < 0.5)
			{
				System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + "> Mademoiselle, s'il vous plaît");
			}
			else if(Administration.currentBar.clients.get(indexClient).getDegreAlcoolemie() >= 0.5)
			{
				if(Administration.currentBar.clients.get(indexClient).getClass().getName().equalsIgnoreCase("concoursbelote.ClientFemme"))
				{
					System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + "> Et Ho, Bella!!");
				}
				else if(Administration.currentBar.clients.get(indexClient).getClass().getName().equalsIgnoreCase("concoursbelote.ClientHomme"))
				{
					System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + "> Viens ici Chérie!!!");
				}
			}
		}
	}
	
	
	/**
	 * Offre un pourboire à un serveur uniquement si ça cote de popularité dépasse un certain seuil.
	 * @author Guillaume
	 * @param indexServeur
	 */
	public void offrirUnPourboire(int indexServeur, int indexClient)
	{
		Double pourboire = new Double(0);
		Random rnd = new Random();
		pourboire = (double) ((rnd.nextInt(10)) + 1) / 10;
		System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + "> Tenez, c'est pour vous");
		Administration.currentBar.clients.get(indexClient).setPorteMonnaie(Administration.currentBar.clients.get(indexClient).getPorteMonnaie() - pourboire);
		System.out.println("<" + Administration.currentBar.serveur.get(indexServeur).getPrenom() + "> Merci à vous, c'est très gentil");
		Administration.currentBar.serveur.get(indexServeur).setPorteMonnaie(Administration.currentBar.serveur.get(indexServeur).getPorteMonnaie() + pourboire);
	}
	
	
	/**
	 * Choisi aléatoirement l'action d'un client qui n'a plus le droit de boir de boisson alcoolisée
	 * @author Shehu
	 * @return
	 */
	public int etreViolent(int indexClient)
	{
		Random rnd = new Random();
		Integer brin = new Integer(rnd.nextInt(4));
		
		switch(brin)
		{
			case 0:
				System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + ">\n '"  + Administration.currentBar.clients.get(indexClient).getCriSignificatif() + "' Sérieusement???  Sers moi mon verre de suite sinon jte tape. Bande d'enf*** de m***");
				Administration.currentBar.getPatronne().faireExclure(indexClient, 10);
				break;
			case 1:
				System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + ">\n '"  + Administration.currentBar.clients.get(indexClient).getCriSignificatif() + "' Quoi?? Mais elle est folle celle là!!!  Tu me sers ce que j'ai demandé tout de suite");
				Administration.currentBar.getPatronne().faireExclure(indexClient, 5);
				break;
			case 2:
				int index = Administration.selectionBoissonSansAlcool();
				System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + ">\n '"  + Administration.currentBar.clients.get(indexClient).getCriSignificatif() + "' Je prendrais " + 
                                        Administration.currentBar.mesBoissons.get(index).getEcriture() + " " + Administration.currentBar.mesBoissons.get(index).getNomBoisson() + " dans ce cas");
				return index;
			case 3:
				System.out.println("<" + Administration.currentBar.clients.get(indexClient).getPrenom() + ">\n '"  + Administration.currentBar.clients.get(indexClient).getCriSignificatif() + "' Je prend rien alors, laissez tomber");
				Administration.avecClient();
		}
		return 0;
	}
	
	/**
	 * Permet à un client d'offrir un ver à un serveur
	 * @author Guillaume
	 * @param indexClient
	 * @param indexServeur
	 */
	public void offrirUnVerre(int indexClient, int indexServeur)
	{
		int eau = Administration.rechercheIndexEau();
		Administration.currentBar.clients.get(indexClient).payer(Administration.currentBar.mesBoissons.get(eau).getPrixVenteVerre(), indexClient);
		Administration.currentBar.getBarman().gestionDeLaCaisse(Administration.currentBar.mesBoissons.get(eau).getPrixVenteVerre());
		Administration.currentBar.getBarman().servirUnVerre(eau);
		Administration.currentBar.serveur.get(indexServeur).boireDeLeau();
	}
}
